<?php
/**
* @todo dar posibilidad de definir los objetos request response dispatcher y router antes de instanciarlos
*/
/**
* @desc Front controller uno de los componentas principales de la implentacion de MVC
*/
require_once "Gi_Request.php";
require_once "Gi_Router.php";
require_once "Gi_Dispatcher.php";
require_once "Gi_Response.php";

class Gi_Controller_Front {
  /**
  * @desc Instancia singleton del front controller
  */
  private static $_instance = null;
  
  /**
  * @desc Directorio donde estan todos los demas directorios de la aplicacion
  */
  private $_app_dir = "../app";
  
  /**
  * @desc directorio donde estan los view scripts
  */
  private $_view_dir = "views";
  
  public $request;
  public $router;
  public $dispatcher;
  public $response;
  
  
  //constructon privado para hacer singleton la clase
  private function __construct () {
  }
  // para evitar clonado del objeto
  private function __clone () {
  }
  
  /**
  * @desc Obtiene la instancia singleton del objeto singleton
  */
  public static function get_instance () {
    if  (self::$_instance === null) {
      self::$_instance = new self();
    }
    return self::$_instance;
  } 
  
  public function set_app_dir ($dir) {
    if (!is_string($dir))
      throw new Gi_Exception("El parametro debe ser un string");
    $this->_app_dir = $dir;      
  }
  
  public function set_view_dir ($dir = null) {
    if (is_string($dir) || $dir === null)
      $this->_view_dir = $dir;     
    else
      throw new Gi_Exception("El parametro debe ser un string");
  }
  
  public function get_app_dir () {
    return $this->_app_dir;
  }
  
  public function get_view_dir () {
    return $this->_view_dir;
  }
  
  public static function run () {
    ob_start();
    $instace = self::get_instance();
    $instace->request = new Gi_Request();
    
    $instace->router = new Gi_Router($instace->request);
    
    $instace->router->set_route();  
    
    $instace->dispatcher = new Gi_Dispatcher();
  
    $instace->dispatcher->set_request($instace->request);
    
    $instace->dispatcher->dispatch();
    
    $instance->response = new Gi_Response(ob_get_contents());
    ob_end_clean();
    echo $instance->response;
  }
}
